# 资源管理子系统

Master负责异步的处理不同类型的任务， 比如 创建/删除/更新/比对副本是否一致等数据分片和元数据分片的操作，管理数据节点和元数据节点的存活状态，创建和维护卷信息。

Master有多个节点，它们之间通过raft算法保证元数据一致性，并且把元数据持久化到RocksDB。

## 基于利用率的分布策略

基于利用率的分布策略放置文件元数据和内容是Master最主要的特征，此分布策略能够更高效的利用集群资源。
数据分片和元数据分片的分布策略工作流程：
1. 创建卷的时候，Master根据剩余磁盘/内存空间加权计算，选择权重最高的数据节点创建数据/元数据分片，写文件时，客户端随机选择数据分片和元数据分片。
2. 如果卷的大部分数据分片是只读，只有很少的数据分片是可读写的时候，master会自动创建新的数据分片来分散写请求。

基于利用率的分布策略能带来两点额外的好处：

1. 当新节点加入时，不需要重新做数据均衡，避免了因为数据迁移带来的开销。
2. 因为使用统一的分布策略,  显著降低了产生热点数据的可能性。

## 副本放置

Master确保一个分片的多个副本都在不同的机器上。

## 拆分元数据分片

满足下面任意一个条件，元数据分片将会被拆分
1. 元数据节点内存使用率达到设置的阈值，比如总内存是64GB，阈值是0.75，如果元数据节点使用的内存达到48GB，该节点上的所有元数据分片都将会被拆分。
2. 元数据分片占用的内存达到16GB

::: warning 注意
只有元数据分片ID是卷所有元数据分片中ID最大的，才会真正被拆分。
:::

假设元数据分片A符合拆分条件，其inode范围是`[0,正无穷)`，则拆分后A的范围为`[0,A.MaxInodeID+step)`，新生成的B分片的范围是`[A.MaxInodeID+step+1，正无穷)`，其中step是步长，默认是2的24方，MaxInodeID是由元数据节点汇报。

## 异常处理

如果数据/元数据分片某个副本不可用 (硬盘失败、硬件错误等)， 该副本上的数据最终会被迁移到新的副本上。